home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 April / macformat-023.iso / Shareware City / Developers / inc-dec / source / inc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-20  |  3.9 KB  |  180 lines  |  [TEXT/KAHL]

  1. /* ========== the commmand file: ==========
  2.  
  3.     inc.c
  4.     
  5.     Copyright (c) 1993,1994 Newport Software Development
  6.     
  7.     You may distribute unmodified copies of this file for
  8.     noncommercial purposes.  You may use this file as a
  9.     reference when writing your own nShell(tm) commands.
  10.     
  11.     All other rights are reserved.
  12.     
  13.    ========== the commmand file: ========== */
  14.  
  15. #ifdef __MWERKS__            // CodeWarrior requires an A4 setup
  16. #include <A4Stuff.h>
  17. #endif
  18.  
  19. #include "nshc.h"
  20.  
  21. #include "arg_utl.proto.h"
  22. #include "nshc_utl.proto.h"
  23. #include "str_utl.proto.h"
  24.  
  25. /* ======================================== */
  26.  
  27. int  inc_number(Str255 value);
  28. int  inc_init(t_nshc_parms *nshc_parms,t_nshc_calls *nshc_calls,Str32 name,Str255 var,long *value,long *offset);
  29.              
  30. /* ======================================== */
  31.  
  32. int inc_number(Str255 value)
  33. {
  34.     int        pos;
  35.     char    c;
  36.     
  37.     pos = 1;
  38.     
  39.     if ( value[ pos ] == '-' ) pos++;
  40.  
  41.     for ( ; pos <= value[0]; pos++ ) {
  42.         c = value[pos];
  43.         if ((c < '0') || (c > '9'))
  44.             return( 1 );
  45.         }
  46.     
  47.     return( 0 );
  48. }
  49.  
  50. /* ======================================== */
  51.  
  52. int inc_init( t_nshc_parms *nshc_parms,
  53.              t_nshc_calls *nshc_calls,
  54.              Str32 name,
  55.              Str255 var,
  56.              long *value,
  57.              long *offset )     
  58. {
  59.     char    *p;
  60.     char    *q;
  61.     char    c;
  62.     int        argc;
  63.     int        i;
  64.     int        error;
  65.     
  66.     // return if bad include file version
  67.         
  68.     if (nshc_bad_version( nshc_parms, nshc_calls, NSHC_VERSION ))
  69.         return( 0 );
  70.     
  71.     // return if bad usage
  72.     
  73.     argc = nshc_parms->argc;
  74.     
  75.     if ( ( argc < 2 ) || ( argc > 3 ) ) {
  76.         nshc_calls->NSH_putStr_err( "\pUsage: " );
  77.         nshc_calls->NSH_putStr_err( "\pinc: variable [offset]\r" );
  78.         nshc_parms->result = NSHC_ERR_PARMS;
  79.         nshc_parms->action = nsh_idle;
  80.         return( 0 );
  81.         }
  82.     
  83.     // return if bad variable name
  84.     
  85.     p = q = &nshc_parms->arg_buf[ nshc_parms->argv[ 1 ] ];
  86.     i = 0;
  87.     while (c = *p++) {
  88.         error = 1;
  89.         if ( c == '_' ) error = 0; else
  90.         if ( ( c >= 'a' ) && ( c <= 'z' ) ) error = 0; else
  91.         if ( ( c >= 'A' ) && ( c <= 'Z' ) ) error = 0; else
  92.         if ( ( c >= '0' ) && ( c <= '9' ) ) error = 0;
  93.         if (error) {
  94.         nshc_calls->NSH_putStr_err( "\pinc: Invalid variable name = " );
  95.             nshc_calls->NSH_puts_err( q );
  96.             nshc_calls->NSH_putchar_err( '\r' );
  97.             nshc_parms->result = NSHC_ERR_PARMS;
  98.             nshc_parms->action = nsh_idle;
  99.             return( 0 );
  100.             }
  101.         name[++i] = c;
  102.         }
  103.         
  104.     if ( i > 31 ) {
  105.         nshc_calls->NSH_putStr_err( "\pinc: Variable name too long = " );
  106.         nshc_calls->NSH_puts_err( q );
  107.         nshc_calls->NSH_putchar_err( '\r' );
  108.         nshc_parms->result = NSHC_ERR_PARMS;
  109.         nshc_parms->action = nsh_idle;
  110.         return( 0 );
  111.         }
  112.         
  113.     name[0] = i;
  114.  
  115.     if ( nshc_calls->NSH_var_env( name, var ) ) {
  116.         nshc_calls->NSH_putStr_err( "\pinc: Variable not found = " );
  117.         nshc_calls->NSH_putStr_err( name );
  118.         nshc_calls->NSH_putchar_err( '\r' );
  119.         nshc_parms->result = NSHC_ERR_PARMS;
  120.         nshc_parms->action = nsh_idle;
  121.         return( 0 );
  122.         }
  123.         
  124.     if ( inc_number( var ) ) {
  125.         nshc_calls->NSH_putStr_err( "\pinc: variable must contain an integer.\r" );
  126.         nshc_parms->result = NSHC_ERR_PARMS;
  127.         nshc_parms->action = nsh_idle;
  128.         return( 0 );
  129.         }
  130.         
  131.     StringToNum( var, value );
  132.         
  133.     // return if bad offset
  134.     
  135.     *offset = 1;
  136.     
  137.     if ( argc == 3 )
  138.         if ( nshc_is_numeric_operand( nshc_parms, 2 ) )
  139.             *offset = arg_to_num( nshc_parms, 2 );
  140.         else {
  141.             nshc_calls->NSH_putStr_err( "\pinc: Offset must be an integer.\r" );
  142.             nshc_parms->result = NSHC_ERR_PARMS;
  143.             nshc_parms->action = nsh_idle;
  144.             return( 0 );
  145.             }
  146.     
  147.     return( 1 );
  148. }
  149.  
  150. /* ======================================== */
  151.  
  152. void main(t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls)
  153. {
  154.     Str32    name;
  155.     Str255    var;
  156.     long    value;
  157.     long    offset;
  158.     
  159. #ifdef __MWERKS__
  160.     long oldA4  = SetCurrentA4();
  161. #endif
  162.         
  163.     if ( inc_init( nshc_parms, nshc_calls, name, var, &value, &offset ) ) {
  164.     
  165.         value = value + offset;
  166.         
  167.         NumToString( value, var );
  168.         
  169.           nshc_parms->result = nshc_calls->NSH_var_set( name, var );
  170.           
  171.           }
  172.           
  173.     nshc_parms->action = nsh_idle;
  174.  
  175. #ifdef __MWERKS__
  176.     SetA4(oldA4);        // CodeWarrior needs to restore A4
  177. #endif
  178. }
  179.  
  180.